package com.own.business.resource.business.service;

import com.own.business.resource.business.form.SignatureCommonForm;
import com.own.business.resource.common.model.UploadModelConfig;
import com.own.business.resource.core.ResolveObjectStoreUtil;
import com.own.business.resource.core.model.SignatureModel;
import com.own.business.resource.core.model.UploadModel;
import com.own.business.resource.entity.vo.FileRecordVo;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * ResourceService
 *
 * @author chenxueli
 * @date 2023-07-07 14:28:20
 */
public interface ResourceService {

    /**
     * 获取签名信息
     *
     * @param method   上传方式
     * @param fileName 文件名称
     * @return 签名信息
     */
    default SignatureModel signature(String method, String fileName) {
        return signature(method, fileName, null);
    }

    /**
     * 获取签名信息
     *
     * @param method   上传方式
     * @param fileName 文件名称
     * @param form     其他信息
     * @return 签名信息
     */
    SignatureModel signature(String method, String fileName, SignatureCommonForm form);

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param file   上传的文件
     * @param config 上传配置
     * @return 签名信息
     */
    FileRecordVo upload(String method, UploadModel file, UploadModelConfig config);

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param file   上传的文件
     * @return 签名信息
     */
    default FileRecordVo upload(String method, UploadModel file) {
        return upload(method, file, UploadModelConfig.DEFAULT);
    }

    /**
     * 上传文件
     *
     * @param file 上传的文件
     * @return 签名信息
     */
    default FileRecordVo upload(UploadModel file) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), file);
    }

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param files  上传的文件s
     * @return 签名信息
     */
    default List<FileRecordVo> upload(String method, List<UploadModel> files) {
        return files.stream().map(file -> upload(method, file)).collect(Collectors.toList());
    }

    /**
     * 上传文件
     *
     * @param files 上传的文件s
     * @return 签名信息
     */
    default List<FileRecordVo> upload(List<UploadModel> files) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), files);
    }

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param file   上传的文件
     * @return 签名信息
     */
    default FileRecordVo upload(String method, MultipartFile file) {
        return upload(method, new UploadModel(file));
    }

    /**
     * 上传文件
     *
     * @param file 上传的文件
     * @return 签名信息
     */
    default FileRecordVo upload(MultipartFile file) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), file);
    }

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param files  上传的文件s
     * @return 签名信息
     */
    default List<FileRecordVo> upload(String method, MultipartFile[] files) {
        return upload(method, Arrays.stream(files).map(UploadModel::new).collect(Collectors.toList()));
    }

    /**
     * 上传文件
     *
     * @param files 上传的文件s
     * @return 签名信息
     */
    default List<FileRecordVo> upload(MultipartFile[] files) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), files);
    }

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param file   上传的文件
     * @return 签名信息
     */
    default FileRecordVo upload(String method, File file) {
        return upload(method, new UploadModel(file));
    }

    /**
     * 上传文件
     *
     * @param file 上传的文件
     * @return 签名信息
     */
    default FileRecordVo upload(File file) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), file);
    }

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param files  上传的文件s
     * @return 签名信息
     */
    default List<FileRecordVo> upload(String method, File[] files) {
        return upload(method, Arrays.stream(files).map(UploadModel::new).collect(Collectors.toList()));
    }

    /**
     * 上传文件
     *
     * @param files 上传的文件s
     * @return 签名信息
     */
    default List<FileRecordVo> upload(File[] files) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), files);
    }

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param path   文件路径
     * @return 签名信息
     */
    default FileRecordVo upload(String method, String path) {
        return upload(method, new UploadModel(path));
    }

    /**
     * 上传文件
     *
     * @param method 上传方式
     * @param path   文件路径
     * @param config 上传配置
     * @return 签名信息
     */
    default FileRecordVo upload(String method, String path, UploadModelConfig config) {
        return upload(method, new UploadModel(path), config);
    }

    /**
     * 上传文件
     *
     * @param path 文件路径
     * @return 签名信息
     */
    default FileRecordVo upload(String path) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), path);
    }

    /**
     * 上传文件
     *
     * @param path   文件路径
     * @param config 上传配置
     * @return 签名信息
     */
    default FileRecordVo upload(String path, UploadModelConfig config) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), path, config);
    }

    /**
     * 上传文件
     *
     * @param method   上传方式
     * @param pathList 文件路径列表
     * @return 签名信息
     */
    default List<FileRecordVo> upload(String method, String[] pathList) {
        return upload(method, Arrays.stream(pathList).map(UploadModel::new).collect(Collectors.toList()));
    }

    /**
     * 上传文件
     *
     * @param pathList 文件路径列表
     * @return 签名信息
     */
    default List<FileRecordVo> upload(String[] pathList) {
        return upload(ResolveObjectStoreUtil.defaultMethodName(), pathList);
    }

}
